package com.baizhi.serviceimpl;

import com.baizhi.annotation.AddCache;
import com.baizhi.annotation.DelCache;
import com.baizhi.dao.LikeMapper;
import com.baizhi.dao.VideoMapper;
import com.baizhi.entity.*;
import com.baizhi.po.VideoPO;
import com.baizhi.service.VideoService;
import com.baizhi.util.AliyunOSSUtil;
import com.baizhi.vo.CommonQueryPageVO;
import org.apache.ibatis.session.RowBounds;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;

@Transactional
@Service
public class VideoServiceImpl implements VideoService {

    private static final Logger log = LoggerFactory.getLogger(VideoServiceImpl.class);
    @Resource
    VideoMapper videoMapper;

    @Resource
    LikeMapper likeMapper;

    @AddCache
    @Override
    public CommonQueryPageVO queryAllPages(Integer page, Integer pageSize) {

        //设置查询条件对象
        VideoExample example = new VideoExample();

        //查询总条数
        int total = videoMapper.selectCountByExample(example);

        //创建分页对象  参数：起始条数,数据数
        RowBounds rowBounds = new RowBounds((page-1)*pageSize,pageSize);

        //根据分页查询数据
        List<Video> videos = videoMapper.selectByExampleAndRowBounds(example, rowBounds);

        return new CommonQueryPageVO(page,total,videos);
    }

    @Override
    public void delete(Video video) {


        //根据文件信息
        Video videos = videoMapper.selectOne(video);
        System.out.println(videos);

        //获取图片网路路径
        String videoPath = videos.getVideoPath();
        String coverPath = videos.getCoverPath();

        //字符串处理
        String videoPathName = videoPath.replace("https://yingxue-jys-2103.oss-cn-beijing.aliyuncs.com/", "");
        String coverPathName = coverPath.replace("https://yingxue-jys-2103.oss-cn-beijing.aliyuncs.com/", "");

        /**
         * 将阿里云文件删除
         *  参数：
         * @param bucketName（String）  存储空间名  yingx-2103
         * @param fileName（String）    文件名   目录名/文件名  lalala.png
         * */
        AliyunOSSUtil.deleteFile("yingxue-jys-2103",videoPathName);
        AliyunOSSUtil.deleteFile("yingxue-jys-2103",coverPathName);

        //2.删除数据
        videoMapper.delete(video);
    }

    @DelCache
    @Override
    public void update(Video video) {
        videoMapper.updateByPrimaryKeySelective(video);
    }

    @DelCache
    @Override
    public void add(Video video) {

        video.setId(UUID.randomUUID().toString());
        video.setStatus("1");
        video.setCreateTime(new Date());
        video.setUserId("4");

        log.info("添加视频add:{}",video);

        videoMapper.insertSelective(video);
    }

    @Override
    public HashMap<String, String> uploadHeadImg(MultipartFile videoFile) {

        /*log.info("文件名: {}",videoFile.getOriginalFilename());
        log.info("文件大小: {}",videoFile.getSize());
        log.info("文件类型: {}",videoFile.getContentType());*/

        //获取文件名
        String filename = videoFile.getOriginalFilename();

        //文件名拼接唯一标识
        String newName=new Date().getTime()+"-"+filename;
        //文件名拼接目录名
        String objectName="video/"+newName;


        //dfssf-小可爱.mp4  dfsfs-小可爱.jpg

        /**
         * 1.将文件以字节数组的形式上传至阿里云
         *  参数：
         * @param bucketName（String）  存储空间名
         * @param fileName（String）    文件名   目录名/文件名
         * @param headImg（MultipartFile） MultipartFile类型的文件
         * */
        AliyunOSSUtil.uploadfileBytes("yingxue-jys-2103",objectName,videoFile);

        /**
         * 2.获取阿里云视频文件截取视频封面
         *  参数：
         * @param bucketName（String）  存储空间名  yingx-2103
         * @param fileName（String）    要截取封面的视频名   目录名/文件名
         * */
        URL url = AliyunOSSUtil.videoInterceptCover("yingxue-jys-2103", objectName);
        System.out.println(url);

        //通过视频名获取图片名
        String coverName="videoCover/"+newName.split("\\.")[0]+".jpg";

        /**
         * 3.将视频封面上传至阿里云
         *  参数：
         * @param bucketName（String）  存储空间名  yingx-2103
         * @param fileName（String）    要上传的图片名   目录名/文件名
         * @param netFilePath（String）   要上传文件的网络路径
         * */
        try {
            AliyunOSSUtil.uploadNetIO("yingxue-jys-2103",coverName,url.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        /*try {
            AliyunOSSUtil.videoInterceptCoverUpload("yingx-2103",objectName,coverName);
        } catch (IOException e) {
            e.printStackTrace();
        }*/


        //拼接文件的网络地址
        String netPath="https://yingxue-jys-2103.oss-cn-beijing.aliyuncs.com/"+objectName;
        String coverNames="https://yingxue-jys-2103.oss-cn-beijing.aliyuncs.com/"+coverName;

        HashMap<String, String> map = new HashMap<>();

        map.put("fileName",netPath);
        map.put("coverName",coverNames);

        return map;
    }

    @Override
    public List<VideoPO> queryByReleaseTime() {

        //1.获取数据
        List<VideoPO> videoPOS = videoMapper.queryByReleaseTime();

        //2.遍历视频数据
        for (VideoPO videoPO : videoPOS) {

            //3.获取视频id
            String videoId = videoPO.getId();

            //设置查询条件
            LikeExample example = new LikeExample();
            example.createCriteria().andVideoIdEqualTo(videoId);

            //4.根据视频id查询视频点赞数
            Integer count  = likeMapper.selectCountByExample(example);

            //5.将点赞数放入对象
            videoPO.setLikeCount(count);

        }

        return videoPOS;
    }
}
